#include <iostream>
#include <pthread.h>
#include <unistd.h>
#define NUM 6
int g_num = 10000;//临界资源
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//互斥锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//条件变量
void* active(void* arg)
{
    std::string name = static_cast<const char*>(arg);
    while(true){
        pthread_mutex_lock(&lock);//加锁
        pthread_cond_wait(&cond, &lock);//等待条件
        printf("%s is active\n", name.c_str());
        pthread_mutex_unlock(&lock);//解锁
    }
}
int main()
{
    pthread_t arr[3];
    for(int i = 0; i < 3; i++){
        char *buffer = (char*)malloc(64);
        snprintf(buffer, 64, "thread %d", i);
        pthread_create(&arr[i], nullptr, active, (void*)buffer);//多个线程同时访问临界资源
    }
    while(true){
        printf("main wakeup thread...\n");
        // pthread_cond_signal(&cond);//通知一个线程
        pthread_cond_broadcast(&cond);//通知所有线程
        sleep(1);
    }
    for(int i = 0; i < 3; i++){
        pthread_join(arr[i], nullptr);
    }
    return 0;
}



// pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//互斥锁
// void* test(void* arg)
// {
//     while(true){//不是原子操作，可能存在数据竞争
//         pthread_mutex_lock(&lock);//加锁
//         if(g_num > 0){
//             ::usleep(100);
//             g_num--;
//             // std::cout<<g_num<<std::endl;
//         }else{
//             pthread_mutex_unlock(&lock);//解锁
//             break;
//         }
//         pthread_mutex_unlock(&lock);//解锁
//     }

//     return nullptr;
// }
// int main()
// {
//     pthread_t arr[NUM];
//     for(int i = 0; i < NUM; i++){
//         pthread_create(&arr[i], nullptr, test, nullptr);//多个线程同时访问临界资源
//     }
//     while(true){
//         if(g_num == 0)
//             break;
//         std::cout<<g_num<<std::endl;
//     }
//     std::cout<<g_num<<std::endl;
//     return 0;
// }